package consul

var ConsulTpl = `
package consul

import (
    "fmt"
    "github.com/hashicorp/consul/api"
    "{{.App}}/pkg/storage/conf"
)

// consul 定义一个consul结构体，其内部有一个"*api.Client"字段。
type consulService struct {
    client *api.Client
}

// Consul 连接至consul服务返回一个consul对象
func NewConsul(addr string) (*consulService, error) {
    cfg := api.DefaultConfig()
    cfg.Address = addr
    c, err := api.NewClient(cfg)
    if err != nil {
        fmt.Println(err)
        return nil, err
    }
    return &consulService{c}, nil
}

// RegisterService 将gRPC服务注册到consul
func (c *consulService) RGService(consul conf.Services) error {
// 健康检查

    check := &api.AgentServiceCheck{
        GRPC:     fmt.Sprintf("%s:%d", consul.Host, consul.Port), // 这里一定是外部可以访问的地址
        Timeout:  "10s",                                          // 超时时间
        Interval: "10s",                                          // 运行检查的频率
        // 指定时间后自动注销不健康的服务节点
        // 最小超时时间为1分钟，收获不健康服务的进程每30秒运行一次，因此触发注销的时间可能略长于配置的超时时间。
        DeregisterCriticalServiceAfter: "1m",
    }

    srv := &api.AgentServiceRegistration{
        ID:      fmt.Sprintf("%s-%s-%d", consul.Name, consul.Host, consul.Port), // 服务唯一ID
        Name:    consul.Name,                                                    // 服务名称
        Tags:    []string{"srv"},                                                // 为服务打标签
        Address: consul.Host,
        Port:    consul.Port,
        Check:   check,
    }

    return c.client.Agent().ServiceRegister(srv)
}
`
